iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0

CASSANDRA/SCYLLA 的排序機制與RDBMS不同,在我們RDBMS熟悉的場景裡面,要拿出的資料是可以在查詢指令的時候,針對想要的欄位,下降冪或者升冪的排序指令(order by asc/desc)。

-- ex:
select * from users where id > 1000 order by grade desc,id asc;

CASSANDRA/SCYLLA 也有提供order by指令,但不是隨心所欲,像RDBMS想怎麼用就怎麼用,在create table時期就必須要設計好。

 (此處 2020/09/22發現謬誤,原先說沒有提供ordery by指令,其實是有的,重新更新文章。)

1. 原理

關鍵就在於複合的primary key裡面的clustering key,若clustering key這個名詞印象模糊,可以建議回頭看看Day10. 主鍵(primary key)。

不同於RDBMS,要拿出的資料是可以在查詢指令的時候下降冪或者升冪的排序指令,CASSANDRA/SCYLLA寫入資料的時候,就決定好順序,所以取出的順序一定是固定的。

(或者說寫入時,就按照clustering key的順序寫入)

在寫入時就必須決定好順序,意味著什麼?

這表示這張table,每一個clustering column你只能選擇ASC/DESC其中一種作法,無法同時滿足兩者。

系統預設是ASC,如果要設置成DESC,請見以下示範:

關鍵字叫做clustering order

create table timeseries (
  event_type text,
  insertion_time timestamp,
  event blob,
  PRIMARY KEY (event_type, insertion_time)
)
WITH CLUSTERING ORDER BY (insertion_time DESC);

2. 多個clustering key 與查詢

clustering key的設置在之前primary key的示範就有介紹可以設多組,每個clustering column在建立table的時候,就需要決定用預設的ASC,還是指定使用DESC。

而且,這個clustering key的前後順序也是有意義的,因為這關乎寫入資料的位置。

如果clustering key有兩個,在寫入一筆新的資料時候,一定是先找到符合第一個clustering key順序的位置,再找第二個clustering key的位置。

如以下範例:

CREATE TABLE heartrate_v4 (
   pet_chip_id uuid,
   time timestamp,
   heart_rate int,
   pet_name text,
   PRIMARY KEY (pet_chip_id, pet_name, heart_rate)
);

寫入時先看pet_name該寫到哪個順序位置,再看hear_rate而最終決定資料寫到哪裡。

換句話說,查詢的時候,也會是同樣概念。

如以下範例:

SELECT * from heartrate_v4 WHERE pet_chip_id = 123e4567-e89b-12d3-a456-426655440b23 AND heart_rate = 100;

這個查詢語法會失敗,因為不指定第一個clustering key條件,它會不知道怎麼找。

所以跟partition key一樣,在設定的時候有設多組,那麼查詢條件就都必需填寫

3. 總結where查詢方式

到今天為止,有沒有覺得CASSANDRA/SCYLLA的條件查詢方式,跟熟悉的RDBMS方式有天差地別呢?

其實只要弄懂原理,理解規則之後,也不是那麼困難。

少了查詢方面的彈性,是為了換取效能與高可擴充性,這是必然的取捨。

再進一步講解說明,其實oprater(=、>、<、>=、<=),根據欄位所屬不同種類的key,使用方式也有限制。

Index Key 運算子
Praimary Key Partition Key 只能用 =
Praimary Key Clustering Key 可以用 =、>、<、>=、<=
Secondary Index 只能用 =

Partition Key 要明確指定,系統才知道資料位置在哪個node。

Secondary Index 要明確指定,系統才能反推 Praimary Key,而得知資料位置在哪個node。

Clustering Key本身屬於範圍查詢用途(range query),所以可以接受>、< 等篩選方式。

4. 備註(9/22補充)

primary key欄位,可以在查詢語法裡面下order by,指定asc/desc排序,非primary key的欄位就是不行,原理在這幾篇都介紹了。

因為原本寫入時就有排序過,預設asc,在查詢語法若下order by X欄位 desc,只是它幫你將撈出來的資料反向(reverse)呈現,實際上並不用特別花功夫在處理資料的排序。

參考資料


上一篇
Day12. 次索引(secondary index)
下一篇
Day14. group by / limit
系列文
scylla 從零開始攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言